www.gusucode.com > vc++ 远程控制示例源程序-源码程序 > vc++ 远程控制示例源程序-源码程序\code\PeerYouC\PeerRegeditTreeView.cpp
//Download by http://www.NewXing.com // PeerRegeditTreeView.cpp : implementation file // #include "stdafx.h" #include "PeerYouC.h" #include "PeerRegeditTreeView.h" #include "peerregeditlistview.h" #include "peermessagelistview.h" #include "regeditaddkeydlg.h" #include "MainFrm.h" #include "command.h" #include "peersocket.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CPeerRegeditTreeView IMPLEMENT_DYNCREATE(CPeerRegeditTreeView, CTreeView) CPeerRegeditTreeView::CPeerRegeditTreeView() { } CPeerRegeditTreeView::~CPeerRegeditTreeView() { } BEGIN_MESSAGE_MAP(CPeerRegeditTreeView, CTreeView) //{{AFX_MSG_MAP(CPeerRegeditTreeView) ON_WM_CREATE() ON_WM_LBUTTONDOWN() ON_NOTIFY_REFLECT(NM_RCLICK, OnRclick) ON_COMMAND(ID_REGEDIT_KEY_ADD, OnRegeditKeyAdd) ON_COMMAND(ID_REGEDIT_KEY_DEL, OnRegeditKeyDel) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CPeerRegeditTreeView drawing void CPeerRegeditTreeView::OnDraw(CDC* pDC) { CDocument* pDoc = GetDocument(); // TODO: add draw code here } ///////////////////////////////////////////////////////////////////////////// // CPeerRegeditTreeView diagnostics #ifdef _DEBUG void CPeerRegeditTreeView::AssertValid() const { CTreeView::AssertValid(); } void CPeerRegeditTreeView::Dump(CDumpContext& dc) const { CTreeView::Dump(dc); } #endif //_DEBUG ///////////////////////////////////////////////////////////////////////////// // CPeerRegeditTreeView message handlers int CPeerRegeditTreeView::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CTreeView::OnCreate(lpCreateStruct) == -1) return -1; // TODO: Add your specialized creation code here CTreeCtrl& tree=GetTreeCtrl(); tree.ModifyStyle(0,TVS_HASLINES|TVS_LINESATROOT|TVS_SHOWSELALWAYS| TVS_HASBUTTONS); if(!m_imagelist.Create( 16,16,ILC_MASK,3,1)) return -1; m_imagelist.Add(AfxGetApp()->LoadIcon(IDI_REGCOMPUTER)); m_imagelist.Add(AfxGetApp()->LoadIcon(IDI_REGDIRCLOSE)); m_imagelist.Add(AfxGetApp()->LoadIcon(IDI_REGDIROPEN)); tree.SetImageList(&m_imagelist,TVSIL_NORMAL); return 0; } void CPeerRegeditTreeView::OnLButtonDown(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default CTreeView::OnLButtonDown(nFlags, point); CTreeCtrl& tree=GetTreeCtrl(); HTREEITEM item,root; UINT flag=TVHT_ONITEM|TVHT_ONITEMBUTTON ; if(!(item=tree.HitTest(point,&flag))) return; if(!(root=tree.GetRootItem())) { return; } if(item!=root) { char masterkey[32]; char childkey[512]; WSAEVENT hevent=WSACreateEvent(); if(!hevent) { return; } SOCKET s; COMMAND com; REGEDIT reg; DWORD ret; if(!PeerCreateSocket(&s,PEER_STREAM)) { return; } AfxGetApp()->DoWaitCursor(1); CSplitterWnd* regsplitterwnd=(CSplitterWnd*)GetParent(); CPeerRegeditListView* listview=(CPeerRegeditListView*)regsplitterwnd->GetPane(0,1); CListCtrl& list=listview->GetListCtrl(); if(flag&TVHT_ONITEM) { list.DeleteAllItems(); if(PeerConnectSocket(s,ADDRESS,7788)) { memset(&com,0,sizeof(com)); com.CommandID=PEER_REGEDIT_ENUMVALUE; com.DataSize=sizeof(reg); memset(®,0,sizeof(reg)); MakeRegInfo(tree,item,reg); if(strcmp(reg.sunkey,"SECURITY")==0) { WSACloseEvent(hevent); closesocket(s); AfxGetApp()->DoWaitCursor(0); return; } strcpy(masterkey,reg.key); strcpy(childkey,reg.sunkey); LVITEM litem; char regtype[100]; char regvalue[512]; if(PeerSendDataS(s,(char*)&com,sizeof(com),&ret,hevent)) { WSAResetEvent(hevent); if(!PeerSendDataS(s,(char*)®,sizeof(reg),&ret,hevent)) { WSACloseEvent(hevent); closesocket(s); AfxGetApp()->DoWaitCursor(0); MESS(masterkey,childkey,"失败",0); return; } while(PeerRecvDataS(s,(char*)®,sizeof(reg),&ret,hevent)&&ret==sizeof(reg)) { WSAResetEvent(hevent); int index=list.GetItemCount(); litem.cchTextMax=512; int image; if(reg.type==REG_BINARY|| reg.type==REG_DWORD|| reg.type==REG_RESOURCE_LIST|| reg.type==REG_LINK|| reg.type==REG_DWORD_BIG_ENDIAN|| reg.type==REG_FULL_RESOURCE_DESCRIPTOR ) { image=1; } else if(reg.type==REG_SZ|| reg.type==REG_EXPAND_SZ|| reg.type==REG_NONE|| REG_MULTI_SZ) { image=0; } else image=3; list.InsertItem(index,reg.value,image); litem.mask=TVIF_TEXT|TVIF_IMAGE ; litem.iItem=index; litem.iSubItem=1; litem.cchTextMax=512; GetType(reg.type,regtype); litem.pszText=regtype; list.SetItem(&litem); litem.iSubItem=2; regvalue[0]=0; if(reg.datalen>0) memcpy((char*)regvalue,(char*)reg.data,reg.datalen); SetType(reg.type,regvalue,reg.datalen); litem.pszText=regvalue; list.SetItem(&litem); } } MESS(masterkey,childkey,"成功",0); } } if(flag&TVHT_ONITEMBUTTON) { if(tree.GetItemState(item,TVIS_EXPANDED)&TVIS_EXPANDEDONCE) return; HTREEITEM delitem; while((delitem=tree.GetChildItem(item))) { tree.DeleteItem(delitem); } if(PeerConnectSocket(s,ADDRESS,7788)) { memset(&com,0,sizeof(com)); com.CommandID=PEER_REGEDIT_ENUMKEY; com.DataSize=sizeof(reg); memset(®,0,sizeof(reg)); MakeRegInfo(tree,item,reg); if(strcmp(reg.sunkey,"SECURITY")==0) { WSACloseEvent(hevent); closesocket(s); AfxGetApp()->DoWaitCursor(0); return; } strcpy(masterkey,reg.key); strcpy(childkey,reg.sunkey); if(PeerSendDataS(s,(char*)&com,sizeof(com),&ret,hevent)) { WSAResetEvent(hevent); if(!PeerSendDataS(s,(char*)®,sizeof(reg),&ret,hevent)||ret!=sizeof(reg)) { WSACloseEvent(hevent); closesocket(s); AfxGetApp()->DoWaitCursor(0); MESS(masterkey,childkey,"失败",0); return; } HTREEITEM insertitem; while(PeerRecvDataS(s,(char*)®,sizeof(reg),&ret,hevent)&&ret==sizeof(reg)) { WSAResetEvent(hevent); insertitem=tree.InsertItem(reg.sunkey,1,2,item); if(reg.havechild==1) { TVITEM childflag; childflag.mask=TVIF_CHILDREN ; childflag.cChildren=1; childflag.hItem=insertitem; tree.SetItem(&childflag); } } tree.SortChildren(item); tree.Expand(item,TVE_EXPAND); } MESS(masterkey,childkey,"成功",1); } } AfxGetApp()->DoWaitCursor(0); WSACloseEvent(hevent); closesocket(s); } } void CPeerRegeditTreeView::SetType(DWORD type, char *strType,DWORD len) { switch(type) { case REG_BINARY: case REG_RESOURCE_LIST: case REG_FULL_RESOURCE_DESCRIPTOR: case REG_LINK: char tmp[512]; char ch[3]; DWORD i; tmp[0]=0; if(len>170) len=170; for(i=0;i<len;i++) { BYTE ch1,ch2; ch1=(BYTE)(strType[i])>>4; ch2=(BYTE)(strType[i])&0x0f; sprintf(ch,"%x%x ",ch1,ch2); strcat(tmp,ch); } strcpy(strType,tmp); break; case REG_DWORD: case REG_DWORD_BIG_ENDIAN: DWORD word; word=*(DWORD*)strType; sprintf(strType,"0x%x(%u)",word,word); break; case REG_SZ: case REG_EXPAND_SZ: case REG_MULTI_SZ: case REG_NONE: break; default: strcpy(strType,"不能识别"); break; } } void CPeerRegeditTreeView::GetType(DWORD type, char *strType) { switch(type) { case REG_BINARY: strcpy(strType,"REG_BINARY"); break; case REG_DWORD: strcpy(strType,"REG_DWORD"); break; case REG_DWORD_BIG_ENDIAN: strcpy(strType,"REG_DWORD_BIG_ENDIAN"); break; case REG_SZ: strcpy(strType,"REG_SZ"); break; case REG_EXPAND_SZ: strcpy(strType,"REG_EXPAND_SZ"); break; case REG_MULTI_SZ: strcpy(strType,"REG_MULTI_SZ"); break; case REG_RESOURCE_LIST: strcpy(strType,"REG_RESOURCE_LIST"); break; case REG_NONE: strcpy(strType,"REG_NONE"); break; case REG_LINK: strcpy(strType,"REG_LINK"); break; case REG_FULL_RESOURCE_DESCRIPTOR: strcpy(strType,"REG_FULL_RESOURCE_DESCRIPTOR"); break; default: strcpy(strType,"不能识别"); break; } } void CPeerRegeditTreeView::MakeRegInfo(CTreeCtrl& tree,HTREEITEM item,REGEDIT ®) { HTREEITEM parent; char value[512],tmp[512]; value[0]=0;tmp[0]=0; strcpy(value,tree.GetItemText(item)); if(strcmp(value,"HKEY_CLASSES_ROOT")==0|| strcmp(value,"HKEY_CURRENT_USER")==0|| strcmp(value,"HKEY_LOCAL_MACHINE")==0|| strcmp(value,"HKEY_USERS")==0|| strcmp(value,"HKEY_CURRENT_CONFIG")==0) { strcpy(reg.key,value); reg.sunkey[0]=0; return; } parent=item; while((parent=tree.GetParentItem(parent))) { strcpy(tmp,tree.GetItemText(parent)); if(strcmp(tmp,"HKEY_CLASSES_ROOT")==0|| strcmp(tmp,"HKEY_CURRENT_USER")==0|| strcmp(tmp,"HKEY_LOCAL_MACHINE")==0|| strcmp(tmp,"HKEY_USERS")==0|| strcmp(tmp,"HKEY_CURRENT_CONFIG")==0) { strcpy(reg.key,tmp); strcpy(reg.sunkey,value); return; } else { strcat(tmp,"\\"); strcat(tmp,value); strcpy(value,tmp); } } } void CPeerRegeditTreeView::OnRclick(NMHDR* pNMHDR, LRESULT* pResult) { // TODO: Add your control notification handler code here CPoint point; ::GetCursorPos(&point); ScreenToClient(&point); CTreeCtrl& tree=GetTreeCtrl(); HTREEITEM item,root; UINT flag=TVHT_ONITEM|TVHT_ONITEMBUTTON ; if(!(item=tree.HitTest(point,&flag))) return; if(!(root=tree.GetRootItem())) { return; } if(item!=root) { tree.SelectItem(item); ClientToScreen(&point); CMenu menu; VERIFY(menu.LoadMenu(IDR_REGEDIT_TREE)); CMenu* pPopup = menu.GetSubMenu(0); ASSERT(pPopup != NULL); CWnd* pWndPopupOwner = this; while (pWndPopupOwner->GetStyle() & WS_CHILD) pWndPopupOwner = pWndPopupOwner->GetParent(); pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y, pWndPopupOwner); } *pResult = 0; } void CPeerRegeditTreeView::OnRegeditKeyAdd() { // TODO: Add your command handler code here CTreeCtrl& tree=GetTreeCtrl(); HTREEITEM item; if(!(item=tree.GetSelectedItem())||item==tree.GetRootItem()) return; REGEDIT reg; MakeRegInfo(tree,item,reg); CRegeditAddKeyDlg dlg; if(dlg.DoModal()==IDOK) { strcat(reg.sunkey,"\\"); strcat(reg.sunkey,dlg.m_key); HTREEITEM hSearch; if((hSearch=tree.GetChildItem(item))) { if(strcmp(tree.GetItemText(hSearch),dlg.m_key)==0) { MessageBox("已经有此键了,选择另外一个","窥视-客户端",MB_ICONWARNING|MB_OK); return; } else { HTREEITEM hChild; while((hChild=tree.GetNextItem(hSearch,TVGN_NEXT))) { if(strcmp(tree.GetItemText(hChild),dlg.m_key)==0) { MessageBox("已经有此键了,选择另外一个","窥视-客户端",MB_ICONWARNING|MB_OK); return; } hSearch=hChild; } } } SOCKET s; DWORD ret; char meskey[32]; char messunkey[512]; strcpy(meskey,reg.key); strcpy(messunkey,reg.sunkey); if(!PeerCreateSocket(&s,PEER_STREAM)) { return; } WSAEVENT hevent=WSACreateEvent(); if(PeerConnectSocket(s,ADDRESS,7788)) { COMMAND cmd; memset(&cmd,0,sizeof(cmd)); cmd.CommandID=PEER_REGEDIT_CREATEKEY; if(!PeerSendDataS(s,(char*)&cmd,sizeof(cmd),&ret,hevent)) { RegMess(meskey,messunkey,0,"失败"); goto MYERROR ; } if(!PeerSendDataS(s,(char*)®,sizeof(reg),&ret,hevent)) { RegMess(meskey,messunkey,1,"失败"); goto MYERROR ; } else { COMMAND cmd; if(!PeerRecvDataS(s,(char*)&cmd,sizeof(cmd),&ret,hevent)||ret!=sizeof(cmd)) { RegMess(meskey,messunkey,1,"失败"); goto MYERROR ; } tree.InsertItem(dlg.m_key,1,2,item); TVITEM tvitem; tvitem.mask=TVIF_CHILDREN; tvitem.hItem=item; tvitem.cChildren=1; tree.SetItem(&tvitem); tree.Expand(item,TVE_EXPAND); tree.SortChildren(item); } } RegMess(meskey,messunkey,1,"成功"); MYERROR: PeerCloseSocket(s); WSACloseEvent(hevent); } } void CPeerRegeditTreeView::OnRegeditKeyDel() { // TODO: Add your command handler code here CTreeCtrl& tree=GetTreeCtrl(); HTREEITEM item; if(!(item=tree.GetSelectedItem())||item==tree.GetRootItem()) return; REGEDIT reg; MakeRegInfo(tree,item,reg); if(strlen(reg.sunkey)==0) { MessageBox("你不能删除五个主键!!!","窥视-客户端",MB_ICONSTOP|MB_OK); return; } if(MessageBox("确定删除吗?","窥视-客户端",MB_ICONWARNING|MB_OKCANCEL)!=1) return; SOCKET s; DWORD ret; char meskey[32]; char messunkey[512]; strcpy(meskey,reg.key); strcpy(messunkey,reg.sunkey); if(!PeerCreateSocket(&s,PEER_STREAM)) { return; } WSAEVENT hevent=WSACreateEvent(); if(PeerConnectSocket(s,ADDRESS,7788)) { COMMAND cmd; memset(&cmd,0,sizeof(cmd)); cmd.CommandID=PEER_REGEDIT_DELETEKEY; if(!PeerSendDataS(s,(char*)&cmd,sizeof(cmd),&ret,hevent)) { RegMess(meskey,messunkey,0,"失败"); goto MYERROR ; } if(!PeerSendDataS(s,(char*)®,sizeof(reg),&ret,hevent)) { RegMess(meskey,messunkey,0,"失败"); goto MYERROR ; } else { if(!PeerRecvDataS(s,(char*)&cmd,sizeof(cmd),&ret,hevent)||ret!=sizeof(cmd)) { RegMess(meskey,messunkey,0,"失败"); goto MYERROR ; } HTREEITEM parentitem; parentitem=tree.GetParentItem(item); tree.DeleteItem(item); if(parentitem&&!tree.GetChildItem(parentitem)) { TVITEM parent; parent.mask=TVIF_CHILDREN; parent.hItem=parentitem; parent.cChildren=0; tree.SetItem(&parent); } } } RegMess(meskey,messunkey,0,"成功"); MYERROR: PeerCloseSocket(s); WSACloseEvent(hevent); } void CPeerRegeditTreeView::RegMess(char *key, char *sunkey, int flag,char* stat) { CMainFrame* pMainWnd=(CMainFrame*)AfxGetApp()->GetMainWnd(); CListCtrl& mess=pMainWnd->m_pListMessage->GetListCtrl(); CString a; if(flag) a="添加键:\" "; else a="删除键:\" "; CTime t = CTime::GetCurrentTime(); int messcount=mess.GetItemCount(); if(messcount>200) mess.DeleteAllItems(); int insertindex; insertindex=mess.InsertItem(0,stat); a+=key;a+="\\";a+=sunkey;a+="\""; mess.SetItem(insertindex,1,LVIF_TEXT,a,0,0,0,NULL); mess.SetItem(insertindex,2,LVIF_TEXT,ADDRESS,0,0,0,NULL); a=t.Format("%Y-%m-%d %H:%M:%S"); mess.SetItem(insertindex,3,LVIF_TEXT,a,0,0,0,NULL); } void CPeerRegeditTreeView::MESS(char* key,char* childkey, char *ifok,bool flag) { CMainFrame* pMainWnd=(CMainFrame*)AfxGetApp()->GetMainWnd(); CListCtrl& mess=pMainWnd->m_pListMessage->GetListCtrl(); int messcount=mess.GetItemCount(); if(messcount>200) mess.DeleteAllItems(); else { CString a="枚举注册表键: \""; a+=key; if(strlen(childkey)!=0) { a+="\\";a+=childkey; } a+="\""; if(flag) a+=" 的所有子键"; else a+=" 的所有值"; int insertindex; insertindex=mess.InsertItem(0,ifok); mess.SetItem(insertindex,1,LVIF_TEXT,a,0,0,0,NULL); mess.SetItem(insertindex,2,LVIF_TEXT,ADDRESS,0,0,0,NULL); CTime t = CTime::GetCurrentTime(); a=t.Format("%Y-%m-%d %H:%M:%S"); mess.SetItem(insertindex,3,LVIF_TEXT,a,0,0,0,NULL); } }